const { HotelModel, CityModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取酒店总数
const getHotelCount = async (req, res) => {
  try {
    const hotelCountValue = await HotelModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '酒店总数',
      data: hotelCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 获取酒店列表信息
const getHotelList = async (req, res) => {
  try {
    // 从分页中间件中获取分页信息
    const { offset, pageSize } = req.pagination;

    const hotelList = await HotelModel.findAndCountAll({
      attributes: ['hotel_id', 'name', 'images', 'price', 'rating', 'grade', 'type', 'is_hot'],
      include: [
        {
          model: CityModel,
          as: 'hotel_locatedCity',
          attributes: ['name']
        }
      ],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 将数据转化为前端期望的格式
    const formData = {
      count: hotelList.count,
      rows: hotelList.rows.map(item => {
        return {
          id: item.hotel_id,
          name: item.name,
          image: item.images.map((item) => item.url),
          price: item.price,
          rating: item.rating,
          grade: item.grade,
          type: item.type,
          is_hot: item.is_hot,
          city: item.hotel_locatedCity.name
        }
      })
    }

    res.status(200).json({
      title: '酒店列表信息',
      data: formData
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 酒店列表搜索功能
const searchHotel = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const hotelItem = await HotelModel.findAll({
      include: [
        {
          model: CityModel,
          as: 'hotel_locatedCity',
          attributes: ['name']
        }
      ],
      where: {
        [Op.or]: [
          { name: { [Op.like]: `%${searchText}%` } },
          { price: { [Op.like]: `%${searchText}%` } },
          { rating: { [Op.like]: `%${searchText}%` } },
          { grade: { [Op.like]: `%${searchText}%` } },
          { type: { [Op.like]: `%${searchText}%` } },
          { '$hotel_locatedCity.name$': { [Op.like]: `%${searchText}%` } }
        ]
      }
    })

    // 将数据转化为前端期望的格式
    const formData = hotelItem.map(item => {
      return {
        id: item.scenery_id,
        name: item.name,
        image: item.images.map((item) => item.url),
        price: item.price,
        rating: item.rating,
        grade: item.grade,
        type: item.type,
        is_hot: item.is_hot,
        city: item.hotel_locatedCity.name
      }
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: formData
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 酒店热门状态切换
const toggleHotHotel = async (req, res) => {
  try {
    // 获取酒店ID
    const id = req.params.id

    if (!id) {
      return res.status(400).json({ error: '酒店ID不能为空！' })
    }

    const hotHotel = await HotelModel.findByPk(id)

    // 酒店不存在的情况
    if (!hotHotel) {
      return res.status(400).json({ error: '酒店不存在！' })
    }

    // 切换酒店热门状态
    await hotHotel.update({ is_hot: !hotHotel.is_hot })

    // 返回成功响应
    res.status(200).json({
      title: '切换成功',
      message: '酒店热门状态切换成功！'
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 删除酒店
const deleteHotel = async (req, res) => {
  try {
    // 获取酒店ID
    const id = req.params.id

    const result = await HotelModel.destroy({
      where: {
        hotel_id: id
      }
    })

    // 检查是否有记录被删除
    if (result === 0) {
      return res.status(404).json({ error: '没有找到需要删除的酒店记录！' })
    }

    // 删除成功后返回响应
    res.status(200).json({
      title: '删除成功',
      message: '酒店记录已被成功删除!',
      data: result
    })
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 发布酒店
const publishHotelData = async (req, res) => {
  try {
    // 获取酒店ID
    const id = req.body.hotel_id

    // 获取上传的酒店数据
    const data = req.body

    // 如果酒店ID存在则进行修改酒店信息操作，否则就进行新建发布酒店信息操作
    if (id) {
      const hotelItem = await HotelModel.findByPk(id)

      // 未找到酒店的情况
      if (!hotelItem) {
        return res.status(404).json({ error: '未找到需要修改的酒店信息！' })
      }

      // 找到酒店后修改信息
      const updateHotel = await hotelItem.update(data)

      // 返回修改成功的响应
      res.status(200).json({
        title: '修改酒店信息成功',
        data: updateHotel.id
      })
    } else {
      const publishNewHotel = await HotelModel.create(data)
      // 返回创建成功的响应
      res.status(200).json({
        title: '发布酒店成功',
        data: publishNewHotel.id
      })
    }
  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getHotelCount,
  getHotelList,
  searchHotel,
  toggleHotHotel,
  deleteHotel,
  publishHotelData
}